package com.dianzhihan.http3;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@Controller
public class MessageListController {
    public static class Message {
        // 属性得按照和前端约定好的写，分别是 who、whom、what。数据类型是 String
        public String who;
        public String whom;
        public String what;

        public Message(String who, String whom, String what) {
            this.who = who;
            this.whom = whom;
            this.what = what;
        }

        @Override
        public String toString() {
            return "Message{" +
                    "who='" + who + '\'' +
                    ", whom='" + whom + '\'' +
                    ", what='" + what + '\'' +
                    '}';
        }
    }

    private final List<Message> messageList = new ArrayList<>();    // 定义成对象中的属性，就可以在方法间共享

    public MessageListController() {

        // 对象初始化的时候添加 4 个初识的消息，构造方法只执行一次，以后就不再添加了
        messageList.add(new Message("孙悟空", "唐三藏", "师父，你好"));
        messageList.add(new Message("贾宝玉", "林黛玉", "妹妹好眼熟"));
        messageList.add(new Message("张飞", "刘备", "烧了他这茅屋"));
        messageList.add(new Message("李逵", "宋江", "杀到东京去"));
    }

    // 定义动态资源
    // 1. 需要支持 GET 方法，POST 要不要支持不重要，所以我们可以只支持 GET
    // 2. 必须返回 JSON 响应体:
    // 2.1 @ResponseBody 修饰方法
    // 2.2 返回值类型：   必须是对象、map、list && 符合和前端的约定
    // 所以，返回值类型得是 List<Message>
    // 3. 必须和前端请求的路径一致（这也是一种约定），必须是 /message-list.json
    @GetMapping("/message-list.json")
    @ResponseBody
    public List<Message> getMessageList() {
//        List<Message> messageList = new ArrayList<>();  // 局部变量无法在 方法间共享

        return messageList;
    }

    // 1. 接收 form 表单提交上来的数据
    // 分别是 name=who、name=whom、name=what
    // 2. HTTP 方法是 POST
    // 3. 资源路径是 /save-message.do
    // 4. 保存完成之后，重定向到 /message-list.html，别用 @ResponseBody 修饰方法
    // 5. 方法的返回值类型是 String，"redirect:/message-list.html"
    @PostMapping("/save-message.do")
    public String save(
            @RequestParam("who") String p1,
            @RequestParam("whom") String whom,
            String what) {

        Message message = new Message(p1, whom, what);
        System.out.println(message);

        // 最终想让页面看到保存的消息，应该和 getMessageList() 中共享同一份数据
        messageList.add(message);       // 保存属性中，getMessageList() 看到的是同一份对象

        return "redirect:/message-list.html";
    }
}
